perm filename OINITE[NS,SYS] blob sn#102482 filedate 1974-05-22 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	Definitions.  The file DEFS must be assembled with this file.
C00003 00003		storage allocations
C00004 00004	INITER
C00009 00005	WORD
C00013 00006	SORT
C00015 00007	GETCH	FINISH	NOLOOK	NOENTR	NOCORE
C00017 ENDMK
C⊗;
;Definitions.  The file DEFS must be assembled with this file.
IFNDEF DEBUG <DEBUG←1>
	TITLE	INITER -- creater of INI.DAT file from WORDS.TXT

F←0
A←1
B←2
C←3	;current character
D←4
E←5	;counter and temporary AC

L←6
M←7
N←10

Q←11	;byte pointer
R←12	;temporary byte pointer

W←13	;W:Z are used as LOOKUP and ENTER block
X←14
Y←15
Z←16

P←17	;pdl pointer

;I/O channels

TI ←←0	;text input from WORDS.TXT file
DAT←←1	;output to INI.DAT file

LF←←12  FF←←14
;	storage allocations

IFN DEBUG <

LSYM←←2000
SYM:	BLOCK LSYM

>;END IFN DEBUG

DSK17:	17
	SIXBIT	/DSK/
	0

DATCMD:	IOWD 1,DATA	;dump mode command for writing INI.DAT goes here
	0

NTIBUF←←2
TIBUF:	BLOCK 203*NTIBUF;buffer space for reading in WORDS.TXT
IBUF:	BLOCK	3	;buffer header for reading WORDS.TXT

LPDL←←30
PDL:	BLOCK	LPDL	;pushdown list

DIFILE:	SIXBIT	/WORDS/
	SIXBIT	/NON/
	0↔0

DOFILE:	SIXBIT	/INI/
	SIXBIT	/DAT/
	277000,,0
	0
;INITER

INITER:	RESET
	MOVE	P,[IOWD LPDL,PDL]

	INIT	TI,0		;CHANNEL FOR INPUT OF WORDS.TXT
	SIXBIT	/DSK/
	IBUF
	HALT	.

	OPEN	DAT,DSK17	;CHANNEL FOR OUTPUT OF INI.DAT
	HALT	.

	MOVE	A,[DIFILE,,W]
	BLT	A,Z
	LOOKUP	TI,W
	JRST 	NOLOOK

	MOVE	A,[DOFILE,,W]
	BLT	A,Z
	ENTER	DAT,W
	JRST	NOENTR

	MOVEI	A,TIBUF
	MOVEM	A,JOBFF↑
	INBUF	TI,NTIBUF	;SET UP INPUT BUFFER RING

IFN DEBUG,<
	HRLZ	W,JOBSYM↑	;GET PTR TO SYMBOL TABLE
	CAMN	W,[SYM,,0]	;HAS IT BEEN MOVED?
	JRST	NOMOVE		;YES
	HRRI	W,SYM		;ADDRESS OF NEW LOC FOR SYMBOL TABLE
	HRRM	W,JOBSYM	;NEW PTR TO SYMBOL TABLE
	HLRE	X,JOBSYM	;GET LENGTH OF SYMBOL TABLE
	MOVN	X,X		;POSITIVE LENGTH
	CAILE	X,LSYM
	HALT	.		;SYMBOL TABLE TOO BIG
	ADDI	X,-1(W)		;ADDRESS OF LAST WORD
	BLT	W,(X)		;MOVE TABLE
NOMOVE:
>;END DEBUG

	PUSHJ	P,GETREC	;INPUT FILE MUST BE IN E/TV FORMAT
	CAIE	C,FF
	JRST	.-2
;WORD

	SETZM	DATA		;NO STORIES YET
	MOVE	A,[3,,3]
	MOVEM	A,DATA+1	;PTR TO FIRST, LAST AND ONLY DICT ENTRY FOR NOW
	MOVEI	E,6
	MOVSM	E,DATA+2	;PTR TO FIRST FREE WORDS IN .DAT FILE, .TXT FILE
	MOVE	A,[1,,1]
	MOVEM	A,DATA+3	;DICT ENTRY PTRS FORWARD AND BACK
	MOVE	A,[377777,,-1]
	MOVEM	A,DATA+4	;TEXT OF SINGLE WORD IN DICT
	MOVSI	A,-1
	MOVEM	A,DATA+5	;MARK IT AS A NON-WORD

	SETZM	DATA(E)
	MOVEI	A,DATA+1(E)
	HRLI	A,-1(A)
	BLT	A,@JOBREL	;CLEAR CORE FOR .DAT FILE

WORD:	PUSHJ	P,GETCH		;get char from input file
	CAIL	C,"A"		;look for beginning of a word--do we have a letter?
	CAILE	C,"Z"
	JRST	WORD		;no

	MOVEI	A,DATA+20(E)	;MAKE SURE ENOUGH ROOM TO ADD NEW ENTRY TO DICT
	CAMG	A,JOBREL↑	;ENOUGH CORE?
	JRST	COREOK		;YES
	CORE	A,		;NO, GET ENOUGH
	JRST	NOCORE		;OOPS!
	SETZM	DATA(E)
	MOVEI	A,DATA+1(E)
	HRLI	A,-1(A)
	BLT	A,@JOBREL	;CLEAR NEW CORE
COREOK:	

	MOVE	R,[POINT 5,DATA+1(E)] ;byte ptr for depositing text into .DAT file
WORD3:	IDPB	C,R
	PUSHJ	P,GETCH		;get next char
	CAIL	C,"A"		;is it a letter?
	CAILE	C,"Z"
	JRST	WORD4		;NO
	JRST	WORD3		;yes--here we go loop de loop
WORD4:	PUSHJ	P,GETCH
	CAIE	C,LF		;SKIP TO LF
	JRST	WORD4
	MOVEI	A,1
	IORM	A,@R		;TURN ON LOW ORDER BIT TO MARK END OF TEXT OF WORD
;SORT

	MOVEI	C,1		;ptr to dict list header
SORT1:	MOVE	D,C		;D points to prev dict word
	HRRZ	C,DATA(D)	;C points to next dict word
	MOVEI	A,1(E)		;get ptr to text of new word
	MOVEI	B,1(C)		;get ptr to text of old word
SORT2:	MOVE	M,DATA(A)	;get a word of text of new word
	CAMLE	M,DATA(B)	;and compare against corresponding part of old word
	JRST	SORT1		;move on down keyword list
	CAME	M,DATA(B)
	JRST	SORT4		;insert right here in list
	TRNN	M,1		;keywords equal so far--at end of keyword?
	AOJA	A,[AOJA B,SORT2];no--get next part of each keyword
	OUTSTR	[ASCIZ /DUPLICATE /]
	JRST	WORD		;discard entry for new word

SORT4:	HRLI	C,(D)		;make forward/backward ptr for new dict entry
	MOVEM	C,DATA(E)	; and place into entry
	HRRM	E,DATA(D)	;make prev entry point to new one
	HRLM	E,DATA(C)	;make next entry point back to new one
	ADDI	E,2-DATA(R)	;advance free .DAT ptr beyond new entry
	MOVSI	A,-1
	MOVEM	A,DATA-1(E)	;make new entry a non-word
	JRST	WORD		;get next word from input file
;GETCH	FINISH	NOLOOK	NOENTR	NOCORE

GETCH:	SOSG	IBUF+2
GETREC:	IN	TI,
	JRST	GETCH1
	STATZ	TI,20000
	JRST	FINISH
	OUTSTR	[ASCIZ /INPUT FILE ERROR./]
	HALT	.

GETCH1:	ILDB	C,IBUF+1
	JUMPE	C,GETCH
	POPJ	P,

FINISH:	HRLM	E,DATA+2	;STORE PTR TO FIRST FREE WORD IN .DAT FILE
	MOVNI	E,1(E)
	HRLM	E,DATCMD	;SET UP OUTPUT DUMP MODE COMMAND
	OUT	DAT,DATCMD	;WRITE OUT FILE
	JRST	FINIS1
	OUTSTR	[ASCIZ /OUTPUT FILE ERROR./]
	HALT	.

FINIS1:	RELEAS	DAT,
	RELEAS	TI,
	EXIT

NOCORE:	OUTSTR	[ASCIZ/FAILED TO GET ENOUGH CORE.
/]
	HALT	.

NOLOOK:	OUTSTR	[ASCIZ/LOOKUP FAILED -- /]
	HRRZ	X,X		;GET ERROR CODE
	CAILE	X,MAXERR
	MOVEI	X,MAXERR
	OUTSTR	@FERROR(X)
	OUTSTR	[ASCIZ/.
/]
	HALT	.

NOENTR:	OUTSTR	[ASCIZ/ENTER FAILED -- /]
	HRRZ	X,X		;GET ERROR CODE
	CAILE	X,MAXERR
	MOVEI	X,MAXERR
	OUTSTR	@FERROR(X)
	OUTSTR	[ASCIZ/.
/]
	HALT	.

FERROR:	[ASCIZ/NO SUCH FILE/]
	[ASCIZ/ILLEGAL PPN/]
	[ASCIZ/PROTECTION VIOLATION/]
	[ASCIZ/FILE BUSY/]
MAXERR←←.-FERROR
	[ASCIZ/BAD RETRIEVAL OR OTHER HORRIBLE ERROR/]

	LIT
	VAR

DATA:	BLOCK	10

	END	INITER